﻿// 2.接口的简单使用
using System;

public interface IWorker { void Work(string s); }

class James1 : IWorker
{
    public void Work(string s)
    {
        Console.WriteLine("我的名字是James1，我的工作是" + s);
    }
}

class James2 : IWorker
{
    public void Work(string s)
    {
        Console.WriteLine("我的名字是James2，我的工作是" + s);
    }
}

class Program
{
    static void Main(string[] args)
    {
        IWorker james1 = new James1();
        IWorker james2 = new James2();
        james1.Work("设计");
        james2.Work("编程");
        Console.ReadKey();
        // 从这个例子我体会到了有接口的好处，可以想象如果又来了新的员工。
        // 如果不采用接口，而是每个员工都有一个单独的类，这样就会容易出错。
        // 如果有接口这种协议约束的话，那么只要实现了接口就肯定有接口里声明的方法，我们只需拿来调用。
    }
}
/*
 
接口注意的几点：

接口方法不能用public abstract等修饰。接口内不能有字段变量，构造函数。
接口内可以定义属性（有get和set的方法）。如string color { get ; set ; }这种。
实现接口时，必须和接口的格式一致。
必须实现接口的所有方法。
 
 */

/*
 
1.接口的特点
接口的定义是指定一组函数成员而不实现成员的引用类型，其它类型和接口可以继承接口。定义还是很好理解的，但是没有反映特点，接口主要有以下特点：

 (1)通过接口可以实现多重继承，C# 接口的成员不能有 public、protected、internal、private 等修饰符。原因很简单，接口里面的方法都需要由外面接口实现去实现方法体，那么其修饰符必然是 public。C# 接口中的成员默认是 public 的，java 中是可以加 public 的。
 (2)接口成员不能有 new、static、abstract、override、virtual 修饰符。有一点要注意，当一个接口实现一个接口，这2个接口中有相同的方法时，可用 new 关键字隐藏父接口中的方法。
 (3)接口中只包含成员的签名，接口没有构造函数，所以不能直接使用 new 对接口进行实例化。接口中只能包含方法、属性、事件和索引的组合。接口一旦被实现，实现类必须实现接口中的所有成员，除非实现类本身是抽象类。
 (4)C# 是单继承，接口是解决 C# 里面类可以同时继承多个基类的问题。 

 */